import { IdeEventListener, IdeStore } from 'ide-plugin';
import { AppStore } from './store';
import { autocomplete, buildDebounce, decl, file, fmt, outline, saveFile } from '@/api';
import { message } from 'tea-component';

export const ideEventListenerCreater = (ideStore:IdeStore, appStore: AppStore):IdeEventListener => ({
  fmt: async (editorTab, doc, cursorLine, cursorCh) => {
    const param = {
      file: editorTab.path,
      code: doc,
      cursorLine,
      cursorCh
    };
    if (editorTab.fileType === 'go') {
      const fmtRes = await fmt(param);
      if (fmtRes.code === 0) {
        return fmtRes.data.code;
      }
    }
    return '';
  },
  onFileSave: async (editorTab, doc, cursorLine, cursorCh) => {
    const param = {
      file: editorTab.path,
      code: doc
    };
    if (editorTab.fileType === 'go') {
      // const { line, ch } = getLineAndChByPos(code, pos);
      const fmtParam = {
        ...param,
        cursorLine,
        cursorCh
      };
      appStore.setFileLints({});
      try {
        const fmtRes = await fmt(fmtParam);
        if (fmtRes.code === 0) {
          param.code = fmtRes.data.code;
        }
      } catch (e: any) {
        message.error({ content: e.message });
      }
    }
    await saveFile(param).catch(e => {
      message.error({ content: e.message });
    });
    return param.code;
  },
  onFileAutoSave: async (editorTab, doc, cursorLine, cursorCh) => {
    const param = {
      file: editorTab.path,
      code: doc
    };
    // if (editorTab.fileType === 'go') {
    //   // const { line, ch } = getLineAndChByPos(code, pos);
    //   const fmtParam = {
    //     ...param,
    //     cursorLine,
    //     cursorCh
    //   };
    //   appStore.setFileLints({});
    //   try {
    //     const fmtRes = await fmt(fmtParam);
    //     if (fmtRes.code === 0) {
    //       param.code = fmtRes.data.code;
    //     }
    //   } catch (e: any) {
    //     message.error({ content: e.message });
    //   }
    // }
    await saveFile(param).catch(e => {
      message.error({ content: e.message });
    });
    return '';
  },
  onGetFileContent: async (editorTab) => {
    if (!editorTab.path) {
      return '';
    }
    const data = await file({ path: editorTab.path });
    if (data.code === 0) {
      return data.data.content;
    }
    throw Error(data.msg);
  },
  onFileContentUpdate: (editorTab, code) => {
    if (editorTab.fileType === 'go' && code) {
      buildDebounce({
        file: editorTab.path,
        code,
        nextCmd: ''
      });
      outline({ code }).then((data) => {
        if (data.code === 0) {
          appStore.updateFileDecls({
            [editorTab.path]: data.data
          });
        }
      });
    }
  },
  onAddFontSize: () => {
    const index = appStore.setting.editorFontSize ? appStore.fontSizes.indexOf(appStore.setting.editorFontSize) : 0;
    if (index < appStore.fontSizes.length - 1) {
      appStore.updateIdeSetting({
        editorLineHeight: appStore.lineHeights[index + 1],
        editorFontSize: appStore.fontSizes[index + 1]
      });
    }
  },
  onReduceFontSize: () => {
    const index = appStore.setting.editorFontSize ? appStore.fontSizes.indexOf(appStore.setting.editorFontSize) : 0;
    if (index > 0) {
      appStore.updateIdeSetting({
        editorLineHeight: appStore.lineHeights[index - 1],
        editorFontSize: appStore.fontSizes[index - 1]
      });
    }
  },
  autocomplete: async (editorTab, doc, cursorLine, cursorCh) => {
    const options:any = await autocomplete({
      path: editorTab.path,
      code: doc,
      cursorLine: cursorLine - 1,
      cursorCh
    });
    if (options && options[0] && options[1]) {
      return options[1].map((item: any) => ({
        type: item.type || 'constant',
        label: item.name,
        detail: item.class,
        info: item.package
      }));
    }
    return [];
  },
  decl: async (editorTab, doc, cursorLine, cursorCh) => {
    const { code, msg, data } = await decl({
      path: editorTab.path,
      code: doc,
      cursorLine: cursorLine - 1,
      cursorCh
    });
    if (code !== 0) {
      throw new Error(msg);
    } else {
      ideStore.openEditor({
        path: data.path,
        action: {
          type: 'cursor',
          Line: data.cursorLine,
          Ch: data.cursorCh
        }
      });
    }
  },
  onGetFileTipInfo(editorTab) {
      // console.log(editorTab.path);
      const num = editorTab.path.indexOf('/src/')
      return editorTab.path.slice(num+5);
  },
});
//    const addFontSize = useCallback(() => {
//     const index = setting.editorFontSize ? fontSizes.indexOf(setting.editorFontSize) : 0;
//     if (index < fontSizes.length - 1) {
//       updateIdeSetting({
//         editorLineHeight: lineHeights[index + 1],
//         editorFontSize: fontSizes[index + 1]
//       });
//     }
//   }, [setting.editorFontSize, fontSizes]);
//   const reduceFontSize = useCallback(() => {
//     const index = setting.editorFontSize ? fontSizes.indexOf(setting.editorFontSize) : 0;
//     if (index > 0) {
//       updateIdeSetting({
//         editorLineHeight: lineHeights[index - 1],
//         editorFontSize: fontSizes[index - 1]
//       });
//     }
//   }, [setting.editorFontSize, fontSizes]);
